#!/usr/bin/env python3
"""
TAPD 季度总结自动生成系统 - 简化版本
基于 AutoGen 0.7 框架，集成 DeepSeek 大模型
"""

import asyncio
import os
import sys
from datetime import datetime, timedelta
from typing import Dict, List, Optional

# 添加项目根目录到 Python 路径
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from dotenv import load_dotenv
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.messages import TextMessage

from src.config.settings import load_config
from src.utils.model_client import create_deepseek_client


def get_quarter_dates(year: int, quarter: int) -> tuple:
    """获取指定年份季度的开始和结束日期"""
    if quarter == 1:
        start_date = datetime(year, 1, 1)
        end_date = datetime(year, 3, 31)
    elif quarter == 2:
        start_date = datetime(year, 4, 1)
        end_date = datetime(year, 6, 30)
    elif quarter == 3:
        start_date = datetime(year, 7, 1)
        end_date = datetime(year, 9, 30)
    elif quarter == 4:
        start_date = datetime(year, 10, 1)
        end_date = datetime(year, 12, 31)
    else:
        raise ValueError("季度必须是1-4之间的数字")

    return start_date, end_date


async def main():
    """主函数"""
    # 加载环境变量
    load_dotenv()

    # 加载配置
    config = load_config()

    print("🚀 TAPD 季度总结自动生成系统启动")
    print("=" * 50)

    # 获取用户输入
    try:
        year = int(input("请输入年份 (例如: 2024): ").strip() or str(datetime.now().year))
        quarter = int(input("请输入季度 (1-4): ").strip())

        if quarter not in [1, 2, 3, 4]:
            raise ValueError("季度必须是1-4之间的数字")

        start_date, end_date = get_quarter_dates(year, quarter)
        print(f"\n📅 分析时间范围: {start_date.strftime('%Y-%m-%d')} 到 {end_date.strftime('%Y-%m-%d')}")

    except ValueError as e:
        print(f"❌ 输入错误: {e}")
        return

    try:
        # 初始化模型客户端
        model_client = create_deepseek_client(
            api_key=config.deepseek_api_key,
            base_url=config.deepseek_base_url
        )

        print("\n🤖 初始化智能体...")

        # 数据抓取智能体
        scraper_agent = AssistantAgent(
            name="数据抓取员",
            model_client=model_client,
            system_message="""
            你是一个专业的数据抓取专家，负责从 TAPD 系统抓取工作项数据。

            你的职责：
            1. 模拟从 TAPD 系统抓取指定时间范围内的工作项数据
            2. 提供结构化的数据，包括需求、任务、缺陷等
            3. 确保数据的完整性和准确性
            4. 将数据以 JSON 或 Markdown 格式返回

            请根据用户提供的时间范围，生成相应的模拟数据用于演示。
            """
        )

        # 专家分析智能体
        expert_agent = AssistantAgent(
            name="数据分析专家",
            model_client=model_client,
            system_message="""
            你是一个资深的数据分析专家，专门负责分析软件开发项目数据。

            你的职责：
            1. 接收数据抓取员提供的 TAPD 工作项数据
            2. 进行深度数据分析，包括工作量分析、完成率分析、效率分析等
            3. 识别关键趋势和问题
            4. 提供数据洞察和改进建议
            5. 生成详细的分析报告

            请对提供的数据进行全面分析，给出专业的见解。
            """
        )

        # 助手报告智能体
        assistant_agent = AssistantAgent(
            name="报告生成助手",
            model_client=model_client,
            system_message="""
            你是一个专业的报告撰写助手，负责生成高质量的季度总结报告。

            你的职责：
            1. 整合数据抓取员提供的原始数据和专家的分析结果
            2. 生成结构化、专业的季度总结报告
            3. 确保报告逻辑清晰，数据准确，建议可行
            4. 使用商务正式语言，突出重点数据和成果

            请生成一份完整的季度总结报告，包括执行摘要、工作概况、关键指标分析等章节。
            """
        )

        # 创建团队协作
        team = RoundRobinGroupChat([scraper_agent, expert_agent, assistant_agent])

        # 构建任务描述
        task_description = f"""
        请完成 {year} 年第 {quarter} 季度的 TAPD 工作总结报告生成任务：

        时间范围：{start_date.strftime('%Y-%m-%d')} 到 {end_date.strftime('%Y-%m-%d')}

        请按以下步骤协作完成：

        1. 数据抓取员：请生成该时间范围内的 TAPD 工作项模拟数据，包括需求(Story)、任务(Task)、缺陷(Bug)等，每个工作项包含标题、描述、状态、优先级、负责人、工时等信息。

        2. 数据分析专家：对抓取的数据进行分析，计算关键指标如完成率、工时预估准确度、团队效率等，识别问题和趋势。

        3. 报告生成助手：基于原始数据和分析结果，生成完整的季度总结报告。

        请确保数据真实可信，分析深入透彻，报告专业完整。
        """

        print("\n📊 开始执行季度总结任务...")
        print("-" * 30)

        # 执行任务
        result = await team.run(task=task_description)

        print("\n✅ 季度总结报告生成完成！")
        print("=" * 50)

        # 保存结果
        output_dir = f"output/{year}_Q{quarter}"
        os.makedirs(output_dir, exist_ok=True)

        # 保存完整对话记录
        timestamp = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
        conversation_file = f"{output_dir}/conversation_log_{timestamp}.md"

        with open(conversation_file, "w", encoding="utf-8") as f:
            f.write(f"# {year} 年第 {quarter} 季度 TAPD 总结报告生成记录\n\n")
            f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"时间范围: {start_date.strftime('%Y-%m-%d')} 至 {end_date.strftime('%Y-%m-%d')}\n\n")
            f.write("## 完整对话记录\n\n")

            for i, message in enumerate(result.messages, 1):
                f.write(f"### 消息 {i} - {message.source}\n\n")
                f.write(f"{message.content}\n\n")
                f.write("---\n\n")

        # 尝试提取最终报告
        final_report = None
        for message in reversed(result.messages):
            if message.source == "报告生成助手" and len(message.content) > 500:
                final_report = message.content
                break

        if final_report:
            report_file = f"{output_dir}/quarterly_report_{timestamp}.md"
            with open(report_file, "w", encoding="utf-8") as f:
                f.write(final_report)
            print(f"📄 季度报告已保存到: {report_file}")

        print(f"📁 完整记录已保存到: {conversation_file}")

        # 显示最后几条消息
        print("\n📝 最近的对话内容:")
        print("-" * 30)
        for message in result.messages[-3:]:
            print(f"\n🤖 {message.source}:")
            print(f"{message.content[:300]}...")

    except Exception as e:
        print(f"❌ 执行过程中出现错误: {str(e)}")
        import traceback
        traceback.print_exc()


if __name__ == "__main__":
    asyncio.run(main())